﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using EFramework.Web.TypeExtension;

namespace RzCorportativo.Views.Administrativo
{
    [Lib.Permissao(HasValidation = true)]
    public partial class Grupo : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (this.IsPostBack)
                return;
            List<Lib.ItemSistema> itemGrupo = new List<Lib.ItemSistema>();
            int grupoId = 0;
            if (this.Request.QueryString["id"] != null)
            {
                var grupo = Lib.Grupo.CreateInstance(IntExtension.Parse(this.Request.QueryString["id"], 0));
                if (grupo != null)
                {
                    Title = "Grupo - " + grupo.Descricao;
                    grupoId = grupo.GrupoId;
                    GrupoId.Value = grupo.GrupoId.ToString();
                    Descricao.Text = grupo.Descricao;
                    if (grupo.Logins != null)
                    {
                        itemGrupo = grupo.Itens;
                        foreach (var login in grupo.Logins)
                        {
                            var row = new System.Web.UI.HtmlControls.HtmlTableRow();

                            row.Cells.Add(new System.Web.UI.HtmlControls.HtmlTableCell()
                            {
                                InnerText = login.LoginText
                            });

                            row.Cells.Add(new System.Web.UI.HtmlControls.HtmlTableCell()
                            {
                                InnerText = (login.Usuario ?? new Lib.Usuario()).Nome
                            });

                            row.Cells.Add(new System.Web.UI.HtmlControls.HtmlTableCell()
                            {
                                InnerHtml = "<button type='button' class='btn btn-danger' onclick='Remove(" + grupo.GrupoId.ToString() + ", " + login.LoginId.ToString() + ")'>Remover</button>"
                            });

                            row.Attributes.Add("loginId", login.LoginId.ToString());
                            gridGrupo.Rows.Add(row);
                        }
                    }
                    
                }
                List<Lib.ItemSistema> itens = Lib.ItemSistema.Listar(new Lib.ItemSistema());
                
                foreach (var item in itens)
                {
                    var row = new System.Web.UI.HtmlControls.HtmlTableRow();

                    row.Cells.Add(new System.Web.UI.HtmlControls.HtmlTableCell()
                    {
                        InnerText = item.Nome
                    });

                    row.Cells.Add(new System.Web.UI.HtmlControls.HtmlTableCell()
                    {
                        InnerText = item.Url
                    });

                    row.Cells.Add(new System.Web.UI.HtmlControls.HtmlTableCell()
                    {
                        InnerText = (item.TipoItem ?? new Lib.TipoItem() { Descricao = "DESCONHECIDO" }).Descricao
                    });

                    bool exist = itemGrupo.Exists(f => f.ItemId == item.ItemId);

                    row.Cells.Add(new System.Web.UI.HtmlControls.HtmlTableCell()
                    {
                        InnerHtml = "<div class='btn-group' data-toggle='buttons-radio'><input type='button' value='ON' id='btnAddItem" + item.ItemId.ToString() + "Id' class='btn " + (exist ? "active btn-primary" : string.Empty) + "' onclick='AddPermissao(" + item.ItemId + ")' />" +
                                            "<input id='btnRemoveItem" + item.ItemId.ToString() + "Id' type='button' value='OFF' class='btn " + (!exist ? "active btn-danger" : string.Empty) + "' onclick='RemovePermissao(" + item.ItemId + ")' /></div>"
                    });

                    row.Attributes.Add("loginId", item.ItemId.ToString());
                    gridItens.Rows.Add(row);
                }
            }
            this.Login.Attributes.Add("url", this.ResolveUrl("~/Views/Administrativo/Grupo.aspx/ListarLogin"));

        }

        [WebMethod]
        public static List<Lib.Login> ListarLogin(string termo)
        {
            return Lib.Login.Listar(new Lib.Login() {
                LoginText = termo
                //, TipoLogin = Lib.TipoLogin.Interno 
            });
        }

        [WebMethod]
        public static object AddUsuario(int loginId, int grupoId)
        {
            Lib.Grupo grupo = new Lib.Grupo();
            grupo.GrupoId = grupoId;
            var usuarioId = (AppSession.Login ?? new Lib.Login()).LoginId;
            try
            {
                string erros = string.Empty;
                if (grupo.GrupoId.Equals(-1))
                    erros += "Grupo inválido";
                if (loginId.Equals(-1))
                    erros += "Login inválido";
                if (usuarioId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 1
                    };

                if (grupo.AddUser(new Lib.Login() { LoginId = loginId }))
                {

                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true,
                        Value = Lib.Login.CreateInstance(loginId)
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }
        
        [WebMethod]
        public static object RemoverUsuario(int loginId, int grupoId)
        {
            Lib.Grupo grupo = new Lib.Grupo();
            grupo.GrupoId = grupoId;
            var usuarioId = (AppSession.Login.Usuario ?? new Lib.Usuario()).UsuarioId;
            try
            {
                string erros = string.Empty;
                if (grupo.GrupoId.Equals(-1))
                    erros += "Grupo inválido";
                if (loginId.Equals(-1))
                    erros += "Login inválido";
                if (usuarioId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };

                if (grupo.RemoveUser(new Lib.Login() { LoginId = loginId }))
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true,
                        Value = new Lib.Login() { LoginId = loginId }
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }

        [WebMethod]
        public static object AddPermissao(int grupoId, int itemId)
        {
#warning TERMINAR MÉTODO REMOVEITEM E READICIONAR LINHA QUE VALIDA LOGIN

            Lib.Grupo grupo = new Lib.Grupo();
            grupo.GrupoId = grupoId;
            var usuarioId = (AppSession.Login ?? new Lib.Login()).LoginId;
            try
            {
                string erros = string.Empty;
                if (grupo.GrupoId.Equals(-1))
                    erros += "Grupo inválido";
                if (itemId.Equals(-1))
                    erros += "Item inválido";
                if (usuarioId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 1
                    };

                if (grupo.AddItem(new Lib.ItemSistema() { ItemId = itemId }))
                {

                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true,
                        Value = new Lib.ItemSistema() { ItemId = itemId }
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }

        [WebMethod]
        public static object RemovePermissao(int grupoId, int itemId)
        {
#warning TERMINAR MÉTODO REMOVEITEM E READICIONAR LINHA QUE VALIDA LOGIN

            Lib.Grupo grupo = new Lib.Grupo();
            grupo.GrupoId = grupoId;
            var usuarioId = (AppSession.Login.Usuario ?? new Lib.Usuario()).UsuarioId;
            try
            {
                string erros = string.Empty;
                if (grupo.GrupoId.Equals(-1))
                    erros += "Grupo inválido";
                if (itemId.Equals(-1))
                    erros += "Item inválido";
                if (usuarioId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };

                if (grupo.RemoveItem(new Lib.ItemSistema() { ItemId = itemId }))
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true,
                        Value = new Lib.ItemSistema() { ItemId = itemId }
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }
    }
}